#pragma once

#include <string>
#include <vector>
#include <sstream>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <unistd.h>

#include "util.hpp"

const std::string sep = "\r\n";
const std::string default_root = "wwwroot";
const std::string home_page = "index.html";
const std::string page_404 = "wwwroot/404.html";

class httpRequest
{
public:
    // 解析
    void parse()
    {
        // 1. 从_inBuffer中拿到第一行——请求行
        std::string line = util::getOneLine(_inBuffer, sep);
        if(line.empty()) return;
        // 2. 从请求行中获得3个字段：GET url httpversion
        std::cout << "line: " << line << std::endl;// 测试
        std::stringstream ss(line);// 默认以空格为分隔符将内容以流的形式输入到
        ss >> _method >> _url >> _version;
        // 3. 添加web默认路径
        _path = default_root;
        _path += _url;
        if(_path[_path.size() - 1] == '/') _path += home_page;
        
        // 4. 添加文件后缀——明确资源类型
        auto pos = _path.rfind(".");
        if(pos == std::string::npos) _suffix = ".html";
        else _suffix = _path.substr(pos);

        // 5. 添加请求体大小
        struct stat buf;
        int n = stat(_path.c_str(), &buf);
        if(n == 0) _size = buf.st_size;// 资源存在
        else
        {
            n = stat(page_404.c_str(), &buf);// 一定成功
            if(n == 0) _size = buf.st_size;
            else _size = -1;
        }
    }
public:
    std::string _inBuffer;
    // std::string _line;// 请求行
    // std::vector<std::string> _head;// 请求报头
    // std::string _body;// 请求正文

    // 请求行
    std::string _method;// 请求方法
    std::string _url;// 请求目标
    std::string _version;// http版本

    std::string _path;// web根目录
    std::string _suffix;// 资源后缀
    int _size;// 正文长度 or 大小

    std::string _param;// 参数
};

class httpResponse
{
public:
    std::string _outBuffer;
};

